package depth;

/**
 * 字符串API
 *
 * @author
 * @create 2018-12-18 22:06
 **/
public class mystring {

    public static void main(String[] args){
        //intern();
        stringpool();
        //contact();
    }

    /**
     * intern方法的使用
     */
    public static void intern(){
        String s1 = "a";
        String s2 = new String("a");
        String s3 = s2.intern();
        System.out.println(s1==s2);
        System.out.println(s1==s3);

        //false
        //true

        //s1是基本类型，比较值，s2是string实例，比较实例地址
        //调用intern时，如果s2中的字符串不在常量池中，则加入常量池并返回常量的引用
    }

    public static void stringpool(){
        String s = new String("1");
        s.intern();
        String s2 = "1";
        //这里生成了常量池中"1"的引用地址给s2
        System.out.println(s == s2);

        String s3 = new String("1") + new String("1");
        s3.intern();
        String s4 = "11";
        //这里把常量池中指向"11"的引用地址赋值给了s4
        System.out.println(s3 == s4);

        //s3 jdk是把引用地址放到了常量池中,而不是拷贝了一个它的变量

        //false
        //true
    }

    public static void contact(){
        String s1 = "a";
        String s2 = "a";
        String s3 = "a" + s2;
        String s4 = "a" + "a";
        String s5 = s1 + s2;

        //表达式只有常量时，编译期完成计算
        //表达式只有变量时，运行期才计算，所以地址不一样

        System.out.println(s3==s4);
        System.out.println(s3==s5);
        System.out.println(s4=="aa");

        //f
        //f
        //t
    }

    /*public boolean equals(Object anObject){
        if(this == anObject){
            return true;
        }
        if(anObject instanceof String){
            String anotherString = (String)anObject;
            int n = value.length;
            if(n==anotherString.value.length){
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0){
                    if(v1[i] != v2[i]){
                        return false;
                    }
                    i++;
                }
                return true;
            }
        }
        return false;
    }*/
}


